/**
 * 
 * @author edwin
 */
public class PostFixCalc {    
    
    private static void leeYCalcula() {
        StackVector stack1;
        stack1 = new StackVector();
        System.out.println();
        
        while(IngresoTeclado.peek() != '\n'){
            if(Character.isDigit(IngresoTeclado.peek())) {
                double num = (double) IngresoTeclado.getDouble();
                stack1.push(num);
                System.out.println("  Se agrego la constante " + num);
            }
            else {
                char op;
                double x,y;
                double answer;
                op = IngresoTeclado.getChar();
                if(op != '+' && op != '-' && op != '*' && op != '/' && op != '^') {
                    System.out.println("\n Existe un operador no soportado: " + op);
                    return;
                }
                if (stack1.empty()) {
                    System.out.println("La pila estaba vacía al intentar evaluar " + op);
                    System.out.println("\n No existen suficientes numeros en la expresion");
                    return;                   
                }
                y = (double) stack1.pop();
                if(stack1.empty()) {
                    System.out.println("La pila estaba vacía mientras se intento evaluar " + op);
                    System.out.println("\nNo existen suficientes numeros en la expresion");
                    return;
                }
                x = (double) stack1.pop();
                switch(op) {
                    case '+':
                        answer = x+y;
                        break;
                    case '-':
                        answer = x-y;
                        break;
                    case '*':
                        answer = x*y;
                        break;
                    case '/':
                        answer = x/y;
                        break;
                    default:
                        answer = Math.pow(x,y);
                }
                stack1.push(answer);
                System.out.println(" Se evaluo " + op + "y se agrego" + answer);
            }
            System.out.println();
        }
        
        if (stack1.empty()){
            System.out.println("No se dio ninguna expresion");
            return;
        }
        
        double value = (double) stack1.pop();
        System.out.println("  Se quito de la pila " + value);
        
        if (stack1.empty() == false) {
            System.out.println("La pila no esta vacia.!");
            System.out.println("\n No existen suficientes operadores para los numeros");
            return;
        }
        
        System.out.println("\nValor: " + value);
    
    }
    
    
    
    
    
    /**
     * 
     * @param args
     */
    public static void main(String[] args) {
        
        System.out.println("Programa diseñado para evaluar y resolver expresiones");
        System.out.println("en formato postFix.\n");
        System.out.println("Ejemplo:");
        System.out.println("44+");
        System.out.println("o");
        System.out.println("8.43 23.54 + 3 1.34 * 4 + /\n");
        
        while (true) {
            System.out.println("\n Ingrese una expressión en formato PostFix");
            System.out.print("?   ");
            IngresoTeclado.skipBlanks();
            if(IngresoTeclado.peek() == '\n') {
                break;
            }
           leeYCalcula();
           IngresoTeclado.getln();
            
        }
        System.out.println("\nSaliendo del Programa");
    }
    
}
    
